<script setup>

import Dialog from "@/components/dialog/Dialog.vue";
import {onMounted, ref, watch} from "vue";

const props = defineProps({
    sentenceConfigDialog: {
        type: Object,
        default: () => {
            return {
                data: {
                    wordVectorDimension: null,
                    qaWordVectorDimension: null,
                    tf: {
                        use: true
                    }
                }
            }
        }
    }
})
const activeName = ref("wordEmbedding")

onMounted(() => {
    props.sentenceConfigDialog.data.tf.use = true
    activeName.value = "wordEmbedding"
})

const options = [
    {
        value: 0,
        label: '无正则模式'
    },
    {
        value: 1,
        label: 'L1正则模式'
    },
    {
        value: 2,
        label: 'L2正则模式'
    }
]

const emits = defineEmits([
    'onTraining',// 页数改变事件
])

const onTraining = () => {
    emits('onTraining')
}

watch(() => props.sentenceConfigDialog.data.wordVectorDimension, (newValue, oldValue) => {
    props.sentenceConfigDialog.data.qaWordVectorDimension = newValue
    props.sentenceConfigDialog.data.tf.featureDimension = newValue
})

</script>

<template>
    <Dialog :dialog="sentenceConfigDialog">
        <el-form :model="sentenceConfigDialog.data" label-width="auto" :label-position="'top'">

            <el-tabs v-model="activeName">
                <el-tab-pane label="词向量设置" name="wordEmbedding">
                    <el-form-item label="语义分类词向量维度(长语句要设置为偶数)">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.wordVectorDimension" />
                        <el-text>
                            该词向量维度越大，则对越复杂的语义及语句结构表达性越好，但运算速度也越慢。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="用户输入语句最大长度">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.maxWordLength" />
                        <el-text>
                            若输入语句超过该长度，超出部分将被忽略。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="语义分类可信阈值">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.trustPowerTh" :step="0.1" :max="1" :min="0" step-strictly />
                    </el-form-item>
                    <el-form-item label="关键词敏感性嗅探颗粒度">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.keyWordNerveDeep" />
                        <el-text>
                            越大适合越长的句子,越小适合越小的句子
                        </el-text>
                    </el-form-item>
                    <el-form-item label="训练增强次数" v-if="sentenceConfigDialog.data.tag !== 'qa'">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.times" />
                        <el-text>
                            同时增加词向量训练循环次数，最终循环次数 = 训练增强次数 * 用户输入语句最大长度(默认20) * 最长回答长度(默认20)
                        </el-text>
                    </el-form-item>
                    <el-form-item label="词向量学习率(越小越准)">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.weStudyPoint" />
                    </el-form-item>
                    <el-form-item label="词向量正则系数">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.weLParam" />
                    </el-form-item>
                    <el-form-item label="正则模式" >
                        <el-select v-model="sentenceConfigDialog.data.rzModel">
                            <el-option
                                v-for="item in options"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value"
                            />
                        </el-select>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 0">
                            无正则模式即不对权重施加惩罚，或者样本数据量较为大充足时，样本规律性较强，可直接使用无正则模式
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 1">
                            L1正则模式，当出现异常值，或者未见过的异常噪音时，L1的鲁棒性非常强。它是以简化模型，突出重点权重的方式来增强其稳定性与鲁棒性的
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 2">
                            L2正则模式，它更容易调动全部参数特征，让特征平均的落在每个权重上，误差最容易最快下降到最优解的位置上。面对形态多变且种类复杂，或者维度比较大的情况下，能获得最好的优化效果
                        </el-text>
                    </el-form-item>
                </el-tab-pane>

<!--                <el-tab-pane v-if="sentenceConfigDialog.data.tag === 'qa'" label="短语句设置" name="short">-->
<!--                    <el-form-item label="问答词向量维度(需和词向量设置->语义分类词向量维度，参数一直，否则报错)" >-->
<!--                        <el-input-number style="width: 100%" disabled-->
<!--                                         v-model="sentenceConfigDialog.data.qaWordVectorDimension" />-->
<!--                    </el-form-item>-->
<!--                    <el-form-item label="问答最长回答长度" >-->
<!--                        <el-input-number style="width: 100%"-->
<!--                                         v-model="sentenceConfigDialog.data.maxAnswerLength" />-->
<!--                    </el-form-item>-->
<!--                    <el-form-item label="回答语句最大可信阈值">-->
<!--                        <el-input-number style="width: 100%"-->
<!--                                         v-model="sentenceConfigDialog.data.sentenceTrustPowerTh" />-->
<!--                    </el-form-item>-->
<!--                    <el-form-item label="用户输入语句最大长度">-->
<!--                        <el-input-number style="width: 100%"-->
<!--                                         v-model="sentenceConfigDialog.data.maxWordLength" />-->
<!--                    </el-form-item>-->
<!--                    <el-form-item label="QA网络学习正则系数">-->
<!--                        <el-input-number style="width: 100%"-->
<!--                                         v-model="sentenceConfigDialog.data.param" />-->
<!--                    </el-form-item>-->
<!--                    <el-form-item label="小于该输入语句长度的输入语句，训练时不进行跳层">-->
<!--                        <el-input-number style="width: 100%"-->
<!--                                         v-model="sentenceConfigDialog.data.minLength" />-->
<!--                    </el-form-item>-->
<!--                </el-tab-pane>-->

                <el-tab-pane v-if="sentenceConfigDialog.data.tag === 'qa'" label="QA设置" name="long">
                    <el-form-item label="问答词向量维度" >
                        <el-input-number style="width: 100%" disabled
                                         v-model="sentenceConfigDialog.data.qaWordVectorDimension" />
                        <el-text>
                            问答模式下与语义分类词向量维度保持一直
                        </el-text>
                    </el-form-item>
                    <el-form-item label="最长回答长度" >
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.maxAnswerLength" />
                        <el-text>
                            若输入语句超过该长度，超出部分将被忽略。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="回答语句最大可信阈值">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.sentenceTrustPowerTh" />
                    </el-form-item>
                    <el-form-item label="QA网络学习正则系数">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.param" />
                    </el-form-item>
                    <el-form-item label="小于该输入语句长度的输入语句，训练时不进行跳层">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.minLength" />
                    </el-form-item>

                    <el-form-item label="最大时序长度">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.maxLength" />
                    </el-form-item>
                    <el-form-item label="多头数量">
                        <el-input-number style="width: 100%" :min="2"
                                         v-model="sentenceConfigDialog.data.tf.multiNumber" />
                    </el-form-item>
                    <!-- 自然语言的长语句设置中的 特征维度 使用的是 问答词向量维度 -->
                    <el-form-item v-if="sentenceConfigDialog.data.tf.use" label="特征维度">
                        <el-input-number style="width: 100%" disabled
                                         v-model="sentenceConfigDialog.data.tf.featureDimension" />
                        <el-text>
                            如果是自然语言调用，则需与词向量嵌入器设置的词向量维度保持一致
                        </el-text>
                    </el-form-item>
                    <el-form-item label="编解码层深度">
                        <el-input-number style="width: 100%" :min="1"
                                         v-model="sentenceConfigDialog.data.tf.allDepth" />
                    </el-form-item>
                    <el-form-item label="学习率(越小越准)">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.studyPoint" />
                        <el-text>
                            可以使用默认值0.01或者自定义
                        </el-text>
                    </el-form-item>
                    <el-form-item label="线性层softMax分类数量">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.typeNumber" />
                    </el-form-item>
                    <el-form-item label="训练循环次数">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.times" />
                    </el-form-item>
                    <el-form-item label="多线程并行数量">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.coreNumber" />
                        <el-text>
                            理论极限值为你当前设备核心数*2,该值设置小于等于1时，则依然为单进程运算,特征维度超过280，才值得开启并行运算进行加速
                        </el-text>
                    </el-form-item>
                    <el-form-item label="词粒度间隔符">
                        <el-input v-model="sentenceConfigDialog.data.tf.splitWord" />
                        <el-text>
                            默认为空，即不进行分词，若输入为空格，则表示按照空格进行分词，若输入为逗号，则表示按照逗号进行分词，以此类推。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="自增时间序列位置编码">
                        <el-switch v-model="sentenceConfigDialog.data.tf.selfTimeCode" />
                        <el-text>
                            关闭：适合做内容创作类的工作，比如写文章、对话聊天这些需要接着前面内容往下生成的任务，一般效果更好
                            开启：适合判断句子意思属于哪一类的工作，比如判断一段话是新闻、广告还是小说
                        </el-text>
                    </el-form-item>
                    <el-form-item label="时间序列惩罚系数">
                        <el-input-number style="width: 100%" :min="0" :max="1"
                                         v-model="sentenceConfigDialog.data.tf.timePunValue" />
                        <el-text>
                            该参数越大则距离越远的时间序列的特征，对当前序列的特征影响就越大，越近的特征就会变的越小。该参数越小则受远距离的时间序列特征影响就越小，越近的特征影响则越大
                        </el-text>
                    </el-form-item>
                    <el-form-item label="正则系数">
                        <el-input-number style="width: 100%" :min="0" :max="1"
                                         v-model="sentenceConfigDialog.data.tf.regular" />
                        <el-text>
                            取值范围是[0,1),当取值为0时即为无正则影响,调整到合适的正则系数有助于抵抗过拟合，增强网络的鲁棒性与稳定性，
                            该值越大则对神经元权重惩罚越强，推荐默认值是0.01
                        </el-text>
                    </el-form-item>
                    <el-form-item label="正则模式">
                        <el-select v-model="sentenceConfigDialog.data.tf.regularModel">
                            <el-option
                                v-for="item in options"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value"
                            />
                        </el-select>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 0">
                            无正则模式即不对权重施加惩罚，或者样本数据量较为大充足时，样本规律性较强，可直接使用无正则模式
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 1">
                            L1正则模式，当出现异常值，或者未见过的异常噪音时，L1的鲁棒性非常强。它是以简化模型，突出重点权重的方式来增强其稳定性与鲁棒性的
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 2">
                            L2正则模式，它更容易调动全部参数特征，让特征平均的落在每个权重上，误差最容易最快下降到最优解的位置上。面对形态多变且种类复杂，或者维度比较大的情况下，能获得最好的优化效果
                        </el-text>
                    </el-form-item>
                </el-tab-pane>

            </el-tabs>

        </el-form>
        <template #table-dialog-btn>
            <el-button type="primary" @click="onTraining">训练</el-button>
        </template>
    </Dialog>
</template>

<style scoped lang="scss">
:deep(.el-text){
    line-height: 1.2;
}
</style>